home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 33 / Amiga Format AFCD33 (Issue 117, Dec 1998).iso / -seriously_amiga- / graphics / splitmpegppc / src / split.c < prev    next >
C/C++ Source or Header  |  1998-09-07  |  6KB  |  238 lines

  1. /*
  2.  * Copyright (c) 1994 Michael Simmons.
  3.  * All rights reserved.
  4.  * 
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice and the following
  8.  * two paragraphs appear in all copies of this software.
  9.  * 
  10.  * IN NO EVENT SHALL MICHAEL SIMMONS BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF MICHAEL SIMMONS
  13.  * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  * 
  15.  * THE MICHAEL SIMMONS SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND MICHAEL SIMMONS HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20.  *
  21.  * I can be contacted via 
  22.  * Email: michael@ecel.uwa.edu.au
  23.  * Post: P.O. Box 506, NEDLANDS WA 6009, AUSTRALIA
  24.  *
  25.  * Amigaversion by Tobias Seiler in 1997
  26.  * Email: tabs@blader.com
  27.  */
  28.  
  29. /*
  30.  * System layer spliter routines
  31.  */
  32.  
  33. #include    "main.h"
  34.  
  35. static Pack_Header        pack_header;
  36. static System_Header   system_header,system_header2;
  37. static Packet          packet;
  38.  
  39. /*
  40.  *
  41.  *
  42.  */
  43. void split_stream(char *szFileName)
  44. {
  45.     int BufLength;
  46.     unsigned int data;
  47.     int i, ret;
  48.     unsigned int err;
  49.  
  50.     if ((BitStream = fopen(szFileName,"rb")) == NULL){
  51.         errmsg(ERR_OPEN_BSTREAM);
  52.         return;
  53.     }
  54.  
  55. /*    rewind(BitStream); */ /* Could be Socket ? later on */
  56.  
  57.     BufLength = ( BUF_LENGTH + 3) >> 2;
  58.     buf_start = (unsigned int *) malloc(BufLength * 4);
  59.     if( buf_start == NULL){
  60.         fclose(BitStream);
  61.         errmsg(ERR_MALLOC);
  62.         return;
  63.     }
  64.     max_buf_length = BufLength - 1;
  65.  
  66. /* initialize bit io */
  67.     EOF_flag = 0;
  68.     bitOffset = 0;
  69.     bufLength = 0;
  70.     bitBuffer = buf_start;
  71.     curBits = *bitBuffer;
  72.  
  73. /* initialize info on elementary streams */
  74.     for( i=0; i<MAX_NUM_STREAMS; i++){
  75.         streamInfo[i].stream = NULL;
  76.         streamInfo[i].STD_scale =0;
  77.         streamInfo[i].STD_size =0;
  78.         streamInfo[i].PTS_hibit = 0;
  79.         streamInfo[i].PTS = 0;
  80.         streamInfo[i].DTS_hibit = 0;
  81.         streamInfo[i].DTS = 0;
  82.     }
  83.  
  84.     ret = setjmp(env);      /* in case a fatal low level error occurs */
  85.     if (ret != 0 ) {
  86.         errmsg(ret);
  87.     }else{
  88.         system_header_found = FALSE;
  89.         pack_cnt = packet_cnt = system_header_cnt = 0;
  90.  
  91.         next_start_code();
  92.         show_bits32(&data);
  93.         if( data != PACK_START_CODE){
  94.             errmsg(ERR_NOT_SYSTEM_LAYER);
  95.         }else{
  96.             do{
  97.                 if( err = parse_pack()){
  98.                     errmsg(err);
  99.                     break;
  100.                 }
  101.                 next_start_code();
  102.             }while (next_bits(32,PACK_START_CODE));
  103.  
  104.             if( (err == NO_ERROR) && !next_bits(32,ISO_11172_END_CODE))
  105.                 errmsg(ERR_MISSING_END_CODE);
  106.         }
  107.     }
  108.  
  109.     dialog_end();
  110.  
  111.     for( i=0; i<MAX_NUM_STREAMS; i++)
  112.         if( streamInfo[i].stream != NULL ){
  113.             fclose(streamInfo[i].stream);
  114.             streamInfo[i].stream = NULL;
  115.         }
  116.  
  117.      if( BitStream != NULL){
  118.         fclose(BitStream);
  119.         BitStream = NULL;
  120.     }
  121. }
  122.  
  123.  
  124. /*
  125.  * Parse a system layer pack
  126.  * each packet extracted is pass to process_packet for processing
  127.  */
  128.  
  129. int parse_pack()
  130. {
  131.     unsigned int data;
  132.     int err;
  133.  
  134.     if( err = parse_pack_header(&pack_header) )
  135.         return (err | ERR_PARSE_PACK);
  136.  
  137.     pack_cnt++;
  138.     if( verbose_flag && !quiet_flag )
  139.         dialog_pack_header(&pack_header , pack_cnt);
  140.  
  141.     if( next_bits(32,SYSTEM_HEADER_START_CODE)){
  142.         system_header_cnt++;
  143.         if( system_header_found ){
  144.             if( err = parse_system_header( &system_header2 ) )
  145.                 return (err | ERR_PARSE_PACK);
  146.             if( err = compare_system_headers(&system_header,&system_header2) )
  147.                 return (err | ERR_PARSE_PACK);
  148.         }else{
  149.             system_header_found = TRUE;
  150.             if( err = parse_system_header( &system_header ))
  151.                 return (err | ERR_PARSE_PACK);
  152.             dialog_system_header(&system_header);
  153.         }
  154.     }
  155.  
  156.     show_bits32(&data);
  157.     while( (RESERVED_STREAM <= data) && (data <= RESERVED_DATA_STREAM_15) ){
  158.         if( system_header_found == FALSE )
  159.             return (ERR_PARSE_PACK | ERR_MISSING_SYSTEM_HDR);
  160.         if( err = parse_packet(&packet) ){
  161.             cleanup_packet(&packet);
  162.             return (err | ERR_PARSE_PACK);
  163.         }
  164.         if( err = process_packet(&packet) ){
  165.             cleanup_packet(&packet);
  166.             return (err | ERR_PARSE_PACK);
  167.         }
  168.         cleanup_packet(&packet);
  169.         show_bits32(&data);
  170.        }
  171.     
  172.     return NO_ERROR;
  173. }
  174.  
  175. /*
  176.  * Processes a packet of stream data
  177.  * At the moment it appends the packet to a file
  178.  * created for each elemental stream.
  179.  */
  180. int process_packet(Packet *packet)
  181. {
  182.     unsigned int byteswritten;
  183.     unsigned int stream_num;
  184.  
  185.     packet_cnt++;
  186.  
  187.     stream_num = packet->stream_id - (RESERVED_STREAM & 0xff);
  188.  
  189.     if ( streamInfo[stream_num].stream == NULL ){ 
  190.         char szBuf[32];
  191.         sprintf(szBuf,"stm%d.mpg\0",packet->stream_id);
  192.         streamInfo[stream_num].stream = fopen(szBuf,"w");
  193.         if( streamInfo[stream_num].stream == NULL ){
  194.             return (ERR_OPEN_ESTREAM | ERR_PROCESS_PACKET);
  195.         }
  196.         if( verbose_flag && !quiet_flag ){
  197.             char szMsgBuf[100];
  198.             sprintf(szMsgBuf,"Opening stream file %s\0",szBuf);
  199.             dialog_msg(szMsgBuf);
  200.         }
  201.     }
  202.  
  203.     if( packet->buffer == NULL )
  204.         return (ERR_NO_PACKET_BUFFER | ERR_PROCESS_PACKET);
  205.  
  206.     byteswritten = fwrite( (char *)packet->buffer, 1, packet->buffer_size, streamInfo[stream_num].stream);
  207.  
  208.     if( byteswritten != packet->buffer_size )
  209.         return (ERR_WRITE_ESTREAM | ERR_PROCESS_PACKET);
  210.  
  211.     return NO_ERROR;
  212. }
  213.  
  214. /*
  215.  * Cleans up a packet after it has been processed
  216.  */
  217. void cleanup_packet(Packet *packet)
  218. {
  219.     if( packet->buffer != NULL){
  220.         free(packet->buffer);
  221.         packet->buffer = NULL;
  222.     }
  223. }
  224.  
  225. /*
  226.  * This routine compares two system headers and returns and error
  227.  * if they are different
  228.  * Only a stub at the moment
  229.  */
  230. int compare_system_headers(System_Header *system_header,System_Header *system_header2)
  231. {
  232.     if (FALSE )
  233.         return ERR_DIFF_SYSTEM_HDR;
  234.  
  235.     return NO_ERROR;
  236. }
  237.  
  238.